﻿package com.zouloux.utils
{
	public class DateUtils
	{
		// Les mois
		protected static var __monthTags			:Array = ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"];
		
		// Les jours
		protected static var __dayTags				:Array = ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"]
		
		// Les getters
		public static function get monthTags ():Array
		{
			return __monthTags;
		}
		public static function get dayTags ():Array
		{
			return __dayTags;
		}
		
		// Les setters
		public static function set monthTags (value:Array):void
		{
			// Vérifier qu'il y ai bien 12 mois
			if (value.length == 12)
				__dayTags = value;
			else throw Error("DateUtils::set::dayTags, A year has 12 months!");
		}
		public static function set dayTags (value:Array):void
		{
			// Vérifier qu'il y ai bien 7 jours
			if (value.length == 7)
				__dayTags = value;
			else throw Error("DateUtils::set::dayTags, A week has 7 days!");
		}
		
		// Convertir un timeStamp en date lisible
		public static function timestampToDate (pTimeStamp:* = null, pFormat:String = null, pThousand:Boolean = false):String
		{
			// Le timeStamp et la date
			var timeStamp:Number = 0;
			var date:Date;
			
			if (pTimeStamp is Date)
				date = pTimeStamp;
			
			// Vérifier ce qu'on a en entrée
			if (pTimeStamp != null)
			{
				if (pTimeStamp is String)
					timeStamp = parseInt(pTimeStamp, 10);
				else if (pTimeStamp is Number)
					timeStamp = pTimeStamp;
			}
			
			// Multiplier par 1000 pour les timeStamps PHP
			if (pThousand)
				timeStamp *= 1000;
			
			// On vérifier si un timeStamp à été passé, sinon on prend la date de maintenant
			if (timeStamp == 0)
				date = new Date();
			else
				date = new Date(timeStamp);
			
			// On formate la date
			var out:String = __dayTags[date.getDay()] + " " + date.getDate() + " " + __monthTags[date.getMonth()] + " " + date.getFullYear();
			
			// Le retour
			return out;
		}
		
		/**
		 * Affiche une date au format français
		 * Type: Mercredi 5 avril ou Mercredi 5 avril 2010
		 * @param	pDate : La date
		 * @param	pYear : Si on doit afficher l'année
		 * @return : La date au format string
		 */
		public static function showFrenchDate (pDate:Date, pYear:Boolean = false):String
		{
			// Abracadabra
			return __dayTags[pDate.getDay()] + " " + pDate.getDate() + " " + __monthTags[pDate.getMonth()] + (pYear ? " " + pDate.getFullYear(): "")
		}
		
		/**
		 * Afficher l'heure française par rapport à une date
		 * @param	pDate : la date
		 * @param	pHourSeparator : le séparateur entre les heures et les minutes
		 * @return l'heure en string
		 */
		public static function showFrenchHour (pDate:Date, pHourSeparator:String = ":"):String
		{
			// Récupérer les heures et les minutes
			var hour:uint = pDate.getHours();
			var minute:uint = pDate.getMinutes();
			
			// Retourner le tout
			return (hour < 10 ? "0" + hour.toString() : hour) + pHourSeparator + (minute < 10 ? "0" + minute.toString() : minute);
		}
		
		/**
		 * Calculer le nombre de jours dans un mois
		 * @param	iMonth : Le numéro du mois, [0 - 11]
		 * @param	iYear : L'année [19xx - 20xx]
		 */
		public static function countDays (pMonth:uint, pYear:uint)
		{
			return 32 - new Date(pYear, pMonth, 32).getDate();
		}
	}
}